﻿#include "VideoSurface.h"

#include <QCamera>

QList<QVideoFrame::PixelFormat> VideoSurface::supportedPixelFormats(
        QAbstractVideoBuffer::HandleType handleType) const
{
    Q_UNUSED(handleType);

    /** camera支持的格式是预设的，再start之前无从知道支持的格式
     ** 1. 先start，知其格式，再从支持列表中选取
     ** 2. 假设常见主流的支持格式，再去支持列表匹配

    **/
    QList<QVideoFrame::PixelFormat> result;
    // 很奇怪，如果设置下面，对于支持(Format_YUYV, Format_Jpeg)的摄像头，返回frame是Format_YUYV
    //    result  << QVideoFrame::Format_RGB32 << QVideoFrame::Format_YUV420P << QVideoFrame::Format_RGB24 <<QVideoFrame::Format_Jpeg << QVideoFrame::Format_YUYV;

    // 很奇怪，如果设置下面，对于支持(Format_YUYV, Format_Jpeg)的摄像头，返回frame是RGB32
//    result  << QVideoFrame::Format_RGB32 << QVideoFrame::Format_YUV420P << QVideoFrame::Format_RGB24 <<QVideoFrame::Format_Jpeg;
//    result << QVideoFrame::Format_YUV420P <<QVideoFrame::Format_YUYV<< QVideoFrame::Format_RGB32 << QVideoFrame::Format_Jpeg;
    result << QVideoFrame::Format_RGB32;
    // 可以这么认为，首先要求最低支持QVideoFrame::Format_RGB32(这个是必须的），如果支持了摄像头自带的一些格式，那么优先级有的可能比RGB32要高，再没有主动设置格式的情况下选择了优先级较高的回调格式。
    // 目前发现的优先级排序为Format_YUYV,Format_RGB32,Format_Jpeg

    return result;
}

bool VideoSurface::present(const QVideoFrame &frame)
{
    //这里产生的回调每秒大概17次，MAC
    emit generateFrame(frame);
    return true;
}

bool VideoSurface::setSource(QCamera *pCamera)
{
    /* camera设置好参数后（帧率、宽高、格式等），再设置 */
    pCamera->setViewfinder(this);
    return true;
}
